/* Universidad del Valle de Guatemala
 * CC2003 - Algoritmos y Estructuras de Datos
 * HOJA DE TRABAJO #8
 * Fecha de Entrega: Jueves 27 de Octubre de 2011
 */

/**
 * Clase que permite implementar distintas estructuras de datos al diccionario.
 * @author José Antonio Bagur - 10275
 */

/* SE IMPORTAN LAS CLASES QUE SE UTILIZARÁN */
import java.util.*;

public class PersonalSet implements WordSet {
    
     /* ATRIBUTOS DE LA CLASE PERSONAL SET */
    
    /* ---> IMPLEMENTACIONES A PROBAR: BINARY SEARCH TREE
     *                                 SINGLY LINKED LIST
     *                                 CIRCULAR LIST
     *                                 RED BLACK TREE
     *                                 AVL TREE
     */
    private int seteo, indice = 0;
    private BinarySearchTree<Word> searchtree1;
    private SinglyLinkedList<Word> searchtree2;
    private CircularList<Word> searchtree3;
    private RedBlackTree searchtree4;
    private AvlTree searchtree5;
    private Word palabra;
    
    /*
     *  Constructor de la clase PersonalSet, permite elegir una de las implementaciones disponibles.
     */
    public PersonalSet(int opcion) {
        seteo = opcion;
        if (opcion == 1) {
            searchtree1 = new BinarySearchTree<Word>();
        } else if (opcion == 2) {   
            searchtree2 = new SinglyLinkedList<Word>();
        } else if (opcion == 3) {
            searchtree3 = new CircularList<Word>();
        } else if (opcion == 4) {
            searchtree4 = new RedBlackTree(new Word());
        } else if (opcion == 5) {
            searchtree5 = new AvlTree();
        }
        
    }
    
    /**
     * Método que permite añadir una palabra al diccionario, tomando en cuenta 
     * la implementación seleccionada por el usuario.
     * @param wordObject
     * @throws NullPointerException 
     */
    public void add(Word wordObject) throws NullPointerException {
        if (seteo == 1) {
            searchtree1.add(wordObject);
        } else if (seteo == 2) {
            searchtree2.add(wordObject);
        } else if (seteo == 3) {
            searchtree3.add(wordObject);
        } else if (seteo == 4) {
            searchtree4.insert(wordObject);
        } else if (seteo == 5) {
            searchtree5.insert(wordObject);
        }
    }
    
    /**
     * Método que permite obtener una palabra del diccionario, tomando en cuenta
     * la implementación seleccionada por el usuario.
     * @param word
     * @return word palabra seleccionada por el usuario.
     */
    public Word get(Word word) {
        if (seteo == 1) {
            palabra = searchtree1.get(word); 
        } else if (seteo == 2) { 
            if (searchtree2.contains(word)) {
                indice =  searchtree2.indexOf(word);
                palabra = searchtree2.get(indice);
            }
        } else if (seteo == 3) {
            if (searchtree3.contains(word)) {
                indice =  searchtree3.indexOf(word);
                palabra = searchtree3.get(indice);
            }
        } else if (seteo == 4) {
            palabra = (Word) searchtree4.find(word);
        } else if (seteo == 5) {
            palabra = (Word) searchtree5.find(word);
        }
        
        return palabra;
    }
} 


